#include "stdio.h"
#include "stdlib.h"
#include "string.h"

// 输入: "a,b,c\n1,2,3\n4,5,6"
// 输出: [["a","b","c"], ["1","2","3"], ["4","5","6"]]

void parseCSV(char *buf) {
    printf("[");  // 最外层开始
    
    char *copy = strdup(buf); 
    char *save_line;  // 保存行分割的状态
    char *line = strtok_r(copy, "\n", &save_line);  // 按行分割（用save_line保存状态）
    int first_line = 1;
    
    while(line) {
        if(!first_line) {
            printf(", ");  // 行之间的逗号
        }
        first_line = 0;
        
        printf("[");  // 行内数组开始
        char *save_field;  // 保存字段分割的状态
        char *field = strtok_r(line, ",", &save_field);  // 按字段分割（用save_field保存状态）
        int first_field = 1;
        
        while(field) {
            if(!first_field) {
                printf(", ");  // 字段之间的逗号d
            }
            first_field = 0;
            
            printf("\"%s\"", field);  // 字段加引号
            
            // 继续获取当前行的下一个字段（使用字段状态指针）
            field = strtok_r(NULL, ",", &save_field);
        }
        
        printf("]");  // 行内数组结束
        // 继续获取下一行（使用行状态指针，与字段状态不冲突）
        line = strtok_r(NULL, "\n", &save_line);
    }
    
    printf("]");  // 最外层结束
    free(copy);
}

int main(void) {
    char buf[50] = "a,b,c\n1,2,3\n4,5,6";
    parseCSV(buf);
    return 0;
}
